#define _CRT_SECURE_NO_WARNINGS
#include "Stack.h"

void StackInit(Stack* pst)
{
	assert(pst);
	pst->_arr = NULL;
	//指向栈顶,一开始没有元素
	pst->_top = -1;
	pst->_capacity = 0;
}

void CheckCapacity(Stack* pst)
{
	assert(pst);
	if (pst->_top + 1 == pst->_capacity)
	{
		int NewCapacity = pst->_capacity == 0 ? 4 : pst->_capacity * 2;
		//如果传了个空指针,就等价于malloc(NewCapacity *  sizeof(STDataType))
		STDataType* Tmp = (STDataType*)realloc(pst->_arr, NewCapacity * sizeof(STDataType));
		if (Tmp == NULL)
		{
			perror("realloc fail");
			exit;
		}
		pst->_arr = Tmp;
		pst->_capacity = NewCapacity;
	}
}

void StackPush(Stack* pst, STDataType data)
{
	assert(pst);
	CheckCapacity(pst);
	//由于top指向的是栈顶,因此先++,在入栈
	pst->_top++;
	pst->_arr[pst->_top] = data;
}

void StackPop(Stack* pst)
{
	assert(pst);
	//确保栈里面有元素
	assert(pst->_top >= 0);
	pst->_top--;
}

// 获取栈顶元素
STDataType StackTop(Stack* pst)
{
	assert(pst);
	assert(pst->_top >= 0);
	return pst->_arr[pst->_top];
}

// 获取栈中有效元素个数
int StackSize(Stack* pst)
{
	assert(pst);
	//top指向的是栈顶,因此要 + 1,数组下标从0开始
	return pst->_top + 1;
}


// 检测栈是否为空，如果为空返回非零结果，如果不为空返回0 
int StackEmpty(Stack* pst)
{
	assert(pst);
	if (pst->_top == -1)
		return 1;
	return 0;

}

// 销毁栈
void StackDestroy(Stack* pst)
{
	assert(pst);
	free(pst->_arr);
	pst->_arr = NULL;
	pst->_top = -1;
	pst->_capacity = 0;
}
